home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus Leser 19
/
Amiga Plus Leser CD 19.iso
/
Tools
/
Emulatoren
/
GameBoy
/
VGB_Amiga_0.3
/
source
/
CodesED.h
< prev
next >
Wrap
C/C++ Source or Header
|
1995-10-19
|
5KB
|
172 lines
/** VGB: portable GameBoy emulator ***************************/
/** **/
/** CodesED.h **/
/** **/
/** This file contains implementation for the ED table of **/
/** Z80 commands. It is included from Z80.c. **/
/** **/
/** Copyright (C) Marat Fayzullin 1994,1995 **/
/** You are not allowed to distribute this software **/
/** commercially. Please, notify me, if you make any **/
/** changes to this file. **/
/*************************************************************/
case ADC_HL_BC: M_ADCW(BC);break;
case ADC_HL_DE: M_ADCW(DE);break;
case ADC_HL_HL: M_ADCW(HL);break;
case ADC_HL_SP: M_ADCW(SP);break;
case SBC_HL_BC: M_SBCW(BC);break;
case SBC_HL_DE: M_SBCW(DE);break;
case SBC_HL_HL: M_SBCW(HL);break;
case SBC_HL_SP: M_SBCW(SP);break;
case LD_xWORDe_HL:
J.B.l=*(Addr+(R.PC.W++));
J.B.h=*(Addr+(R.PC.W++));
M_WRMEM(J.W,R.HL.B.l);J.W++;
M_WRMEM(J.W,R.HL.B.h);
break;
case LD_xWORDe_DE:
J.B.l=*(Addr+(R.PC.W++));
J.B.h=*(Addr+(R.PC.W++));
M_WRMEM(J.W,R.DE.B.l);J.W++;
M_WRMEM(J.W,R.DE.B.h);
break;
case LD_xWORDe_BC:
J.B.l=*(Addr+(R.PC.W++));
J.B.h=*(Addr+(R.PC.W++));
M_WRMEM(J.W,R.BC.B.l);J.W++;
M_WRMEM(J.W,R.BC.B.h);
break;
case LD_xWORDe_SP:
J.B.l=*(Addr+(R.PC.W++));
J.B.h=*(Addr+(R.PC.W++));
M_WRMEM(J.W,R.SP.B.l);J.W++;
M_WRMEM(J.W,R.SP.B.h);
break;
case LD_HL_xWORDe:
J.B.l=*(Addr+(R.PC.W++));
J.B.h=*(Addr+(R.PC.W++));
R.HL.B.l=*(Addr+(J.W++));
R.HL.B.h=*(Addr+J.W);
break;
case LD_DE_xWORDe:
J.B.l=*(Addr+(R.PC.W++));
J.B.h=*(Addr+(R.PC.W++));
R.DE.B.l=*(Addr+(J.W++));
R.DE.B.h=*(Addr+J.W);
break;
case LD_BC_xWORDe:
J.B.l=*(Addr+(R.PC.W++));
J.B.h=*(Addr+(R.PC.W++));
R.BC.B.l=*(Addr+(J.W++));
R.BC.B.h=*(Addr+J.W);
break;
case LD_SP_xWORDe:
J.B.l=*(Addr+(R.PC.W++));
J.B.h=*(Addr+(R.PC.W++));
R.SP.B.l=*(Addr+(J.W++));
R.SP.B.h=*(Addr+J.W);
break;
case RRD:
I=*(Addr+R.HL.W);
J.B.l=(I>>4)|(R.AF.B.h<<4);
M_WRMEM(R.HL.W,J.B.l);
R.AF.B.h=(I&0x0F)|(R.AF.B.h&0xF0);
R.AF.B.l=(R.AF.B.l&C_FLAG)|(R.AF.B.h? 0:Z_FLAG)|(R.AF.B.h&S_FLAG);
break;
case RLD:
I=*(Addr+R.HL.W);
J.B.l=(I<<4)|(R.AF.B.h&0x0F);
M_WRMEM(R.HL.W,J.B.l);
R.AF.B.h=(I>>4)|(R.AF.B.h&0xF0);
R.AF.B.l=(R.AF.B.l&C_FLAG)|(R.AF.B.h? 0:Z_FLAG)|(R.AF.B.h&S_FLAG);
break;
case LD_A_I:
R.AF.B.h=R.I;
R.AF.B.l=(R.AF.B.l&C_FLAG)|(R.AF.B.h? 0:Z_FLAG)|(R.AF.B.h&S_FLAG);
break;
case LD_A_R:
#ifdef INTERRUPTS
R.AF.B.h=(byte)(-Cnt&0xFF);
#endif
R.AF.B.l=(R.AF.B.l&C_FLAG)|(R.AF.B.h? 0:Z_FLAG)|(R.AF.B.h&S_FLAG);
break;
case LD_I_A: R.I=R.AF.B.h;break;
case LD_R_A: break;
case IM_0: R.IFF&=0xF9;break;
case IM_1: R.IFF=(R.IFF&0xF9)|2;break;
case IM_2: R.IFF=(R.IFF&0xF9)|4;break;
case RETI: R.IFF|=0x01;M_RET;break;
case RETN: R.IFF|=0x01;M_RET;break;
case NEG: I=R.AF.B.h;R.AF.B.h=0;M_SUB(I);break;
case LDI:
I=*(Addr+(R.HL.W++));M_WRMEM(R.DE.W,I);R.DE.W++;R.BC.W--;
R.AF.B.l=(R.AF.B.l&~(N_FLAG|H_FLAG));
break;
case LDIR:
#ifdef INTERRUPTS
Cnt=(Cnt>R.BC.W)? Cnt-R.BC.W:1;
#endif
do
{ I=*(Addr+(R.HL.W++));M_WRMEM(R.DE.W,I);R.DE.W++;R.BC.W--; }
while(R.BC.W);
R.AF.B.l&=~(N_FLAG|H_FLAG);break;
case LDD:
I=*(Addr+(R.HL.W--));M_WRMEM(R.DE.W,I);R.DE.W--;R.BC.W--;
R.AF.B.l=(R.AF.B.l&~(N_FLAG|H_FLAG));
break;
case LDDR:
#ifdef INTERRUPTS
Cnt=(Cnt>R.BC.W)? Cnt-R.BC.W:1;
#endif
do
{ I=*(Addr+(R.HL.W--));M_WRMEM(R.DE.W,I);R.DE.W--;R.BC.W--; }
while(R.BC.W);
R.AF.B.l&=~(N_FLAG|H_FLAG);break;
case CPI:
I=*(Addr+(R.HL.W++));J.B.l=R.AF.B.h-I;R.BC.W--;
R.AF.B.l=
N_FLAG|(R.AF.B.l&C_FLAG)|(J.B.l? 0:Z_FLAG)|(J.B.l&S_FLAG)|
((R.AF.B.h^I^J.B.l)&H_FLAG);
break;
case CPIR:
do
{ I=*(Addr+(R.HL.W++));J.B.l=R.AF.B.h-I;R.BC.W--; }
while(R.BC.W&&J.B.l);
R.AF.B.l=
N_FLAG|(R.AF.B.l&C_FLAG)|(J.B.l? 0:Z_FLAG)|(J.B.l&S_FLAG)|
((R.AF.B.h^I^J.B.l)&H_FLAG);
break;
case CPD:
I=*(Addr+(R.HL.W--));J.B.l=R.AF.B.h-I;R.BC.W--;
R.AF.B.l=
N_FLAG|(R.AF.B.l&C_FLAG)|(J.B.l? 0:Z_FLAG)|(J.B.l&S_FLAG)|
((R.AF.B.h^I^J.B.l)&H_FLAG);
break;
case CPDR:
do
{ I=*(Addr+(R.HL.W--));J.B.l=R.AF.B.h-I;R.BC.W--; }
while(R.BC.W&&J.B.l);
R.AF.B.l=
N_FLAG|(R.AF.B.l&C_FLAG)|(J.B.l? 0:Z_FLAG)|(J.B.l&S_FLAG)|
((R.AF.B.h^I^J.B.l)&H_FLAG);
break;